package com.itservice.supporter_navi;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gcm.GCMRegistrar;
import com.itservice.supporter_navi.MarathonDataBase.MarathonDataBase;
import com.itservice.supporter_navi.MarathonDataBase.libs.DBUtilities;
import com.itservice.supporter_navi.utilities.CommonUtilities;
import com.itservice.supporter_navi.utilities.GCMSendMsg;

public class UserRegistActivity extends Activity implements OnClickListener{
	//====================================================================
	// メンバ変数宣言
	//====================================================================
	private Button RegistButton;					// 名前登録、GCMID取得ボタン用
	private Button ShareButton;						// 登録申請メール作成ボタン用
	private EditText NameEdit; 						// 名前入力用
	private EditText KeyEdit; 						// 登録ID入力用


	private Context context = this;					// アクティビティのコンテキスト保持
	private MarathonDataBase marathonDB; 			// データベースクラス
	private String MyId;							// GCM登録後自分のID保管用
	private String getID;							// スレッドへの受け渡しに使用
	Looper looper;									// スレッドからUI操作の為に使用
	Handler mhandler;								// スレッドからUI操作の為に使用

	//====================================================================
	// ユーザー登録処理
	//====================================================================
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_regist);

		// DBインスタンス取得
        marathonDB = MarathonDataBase.getInstance();
		marathonDB.setContext(this);

		// GCMID取得、名前登録
		RegistButton  = (Button)findViewById(R.id.Regist_btn);
		RegistButton.setOnClickListener(this);

		// 登録申請メール作成ボタン
		ShareButton  = (Button)findViewById(R.id.Share_btn);
		ShareButton.setOnClickListener(this);

		// 登録申請ID入力
		NameEdit = (EditText) findViewById(R.id.Name_Edit);

		// 登録申請ID入力
		KeyEdit = (EditText) findViewById(R.id.Key_Edit);

		//======================================================
		// 既に一度登録を済ませている場合の処理
		//======================================================
		getID = marathonDB.getText(DBUtilities.USER_ID,"NoID"); 				// 自身のGCMIDを取得
		String MyName = marathonDB.getText(DBUtilities.USER_NAME,"NoName");	// 自身の登録した名前を取得
		if(getID.equals("NoID")){
			// no content
		}else{
			// 取得済みのIDを表示
			((TextView) findViewById(R.id.RegistID)).setText(getID);
		}
		if(MyName.equals("NoName")){
			// no content
		}else{
			// 登録済みの名前を表示
			((EditText) findViewById(R.id.Name_Edit)).setText(MyName);
		}


	}
	//====================================================================
	// ボタンが押された時の各処理
	//====================================================================
	@Override
	public void onClick(View v) {
		// 登録が完了していれば、GCMRegistrar.getRegistrationIdで登録IDが取得できる。登録IDが取得できるかどうかで判定処理を行う
		MyId = GCMRegistrar.getRegistrationId(getBaseContext());

		// 登録IDが取得できていない時の処理（なし）
		if(MyId.equals("")){
			// no content
		}

		// 登録IDを取得出来ている時の処理（プリファレンスに自身のIDを保存）
		else{
			// プリファレンス名：pref  モード：自身のアプリのみ使用可能設定
			marathonDB.setText(DBUtilities.USER_ID,MyId); // 自身のIDを保存
		}

		//=======================================================================
		// 名前登録、GCMID取得
		//=======================================================================
		if (v == RegistButton){
			boolean no_inp = false;
			String Name = "";
			// 入力欄に文字列が入力されていないとき
			if(NameEdit.getText().toString().equals("")){
				no_inp = true;
			}
			// 文字列の入力を促すメッセージを表示
			if(no_inp==true){
				Toast toast =Toast.makeText(context, "名前を入力して下さい。",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}
			// 文字列が入力されていた場合
			if(no_inp==false){
				// 入力欄に入力されている文字列を取得
				Name = NameEdit.getText().toString();
				marathonDB.setText(DBUtilities.USER_NAME,Name); // 自身の名前を保存
				Log.i(CommonUtilities.LOG_TAG, Name);
				if (MyId.equals("")) {
					//GCM登録処理を行う。パラメータにセンダーIDを渡す。結果処理はインテントサービスGCMIntentService のonRegisteredメソッドで行う
					GCMRegistrar.register(getBaseContext(), CommonUtilities.SENDER_ID);

					// GCM IDを取得したら画面に表示する
					new Thread(new Runnable() {
						@Override
						public void run() {
							boolean end_flg=false;
							while(end_flg==false){
								getID = marathonDB.getText(DBUtilities.USER_ID,"NoID"); // 自身のGCMIDを取得
								if(getID.equals("NoID")){
									// no content
								}else{
									looper = Looper.getMainLooper();
						        	mhandler = new Handler(looper);
						        	mhandler.post(new Runnable() {
					        		@Override
					        		public void run() {
					        			// 自身のIDを画面に表示
					        			((TextView) findViewById(R.id.RegistID)).setText(getID);
					        			}
						        	});

									// 表示完了したので終了
									end_flg=true;
								}

								// ディレイ処理
								try {
				        			// 無限ループを0.5秒止める(これがないと延々この処理だけが動いてしまい、送信処理をうけつけなくなる、むしろ落ちる)
									Thread.sleep(500);
								} catch(InterruptedException except) {
									except.printStackTrace();
								}
							}
						}
					}).start();
				}else{
					Log.d(CommonUtilities.LOG_TAG, "Already registered.");
				}
			}
		}
		//=======================================================================
		// 登録申請メール作成、メーラー起動処理
		//=======================================================================
		if (v == ShareButton){
			getID = marathonDB.getText(DBUtilities.USER_ID,"NoID"); 				// 自身のGCMIDを取得
			// GCM登録が行われておらず、自身のIDが取得できていない時の処理
			if(getID.equals("NoID")){
				// 画面中央部にGCM登録を促すメッセージを表示
				Toast toast =Toast.makeText(context, "GCM登録を行ってください",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}

			// メーラーを起動してメールタイトルと本文に自身のIDを付与したリンク文を記載
			else{
				// 入力されている認証キーを取得する
				String Key = KeyEdit.getText().toString();

				// 取得した認証キーの文字列長を取得
				int str_leng=Key.length();
				// 文字列長が4ケタの時のみ送信処理を実行する
				if(str_leng == 4){
					// 文字列が全部数字が判定
					boolean digits_flg = CheckDigits(Key);
					// 結果を元に処理
					if(digits_flg==true){
						// 認証キーを保存
						marathonDB.setText(DBUtilities.USER_KEY,Key);

						// メーラー起動用インテント取得
						Intent mailIntent = new Intent(Intent.ACTION_SENDTO);
						// メールタイトル文設定
						mailIntent.putExtra(Intent.EXTRA_SUBJECT, "登録依頼 GCM ID送付");
						// メール本文（リンクをタップしてアプリが起動する様にするため、http始まりの文とする）
						mailIntent.putExtra(Intent.EXTRA_TEXT,"http://com.itservice.supporter_navi"+"/"+ getID + "/" + Key);

						// 送信相手を設定（ユーザ本人に記述してもらうため空白）
						mailIntent.setData(Uri.parse("mailto:"));

						// メーラー起動
						startActivity(Intent.createChooser(mailIntent,"select"));
					}else{
						// 文字列に数値以外の文字が含まれている場合の処理
						Toast toast =Toast.makeText(context, "認証キーは数字4ケタで入力して下さい",Toast.LENGTH_LONG);
						toast.setGravity(Gravity.CENTER, 0, 0);
						toast.show();
					}
				}else{
					// 4ケタじゃなかった時の処理
					Toast toast =Toast.makeText(context, "認証キーは数字4ケタで入力して下さい",Toast.LENGTH_LONG);
					toast.setGravity(Gravity.CENTER, 0, 0);
					toast.show();
				}
			}
		}
	}

	// 文字列が数値かどうかをチェック
	public boolean CheckDigits(String str){
		try {
			Integer.parseInt(str);
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}

	//====================================================================
	// 送信処理を呼び出してメッセージを渡すタスク
	//====================================================================
	public class SendAsyncTask extends AsyncTask<String, String, Long> {
		private String mMsg;			// 送信メッセージ
		private String[] mRegIds;		// 送信先IDを設定

	    public SendAsyncTask(String[] regIds,String msg){
	    	this.mRegIds = regIds;
	    	this.mMsg = msg;
	    }

	    /**
	     * バックグランドで行う処理
	     */
	    @Override
	    protected Long doInBackground(String... params) {
	    	// プレーンテキストで送る場合
	    	//ServerUtilities.sendMessage(mRegId,mMsg);
	        // JSONで送る場合
	    	GCMSendMsg.SendMsg(mRegIds,mMsg);

	    	return null;
	    }
	}
}